6 REM   ****************************************** 
8 REM   *** (DFT4.2) GENERATE/ANALYZE WAVEFORM ***
10 REM  ****************************************** 
12 PI=3.141592653589793#:P2=2*PI:K1=PI/8:K2=1/PI 
14 DIM C(2,16),S(2,16),KC(2,16),KS(2,16)
16 CLS:FOR J=0 TO 16:FOR I=1 TO 2:C(I,J)=0:S(I,J)=0:NEXT:NEXT
19 REM     *******************
20 CLS:REM *    MAIN MENU    *
21 REM     *******************
22 PRINT:PRINT:PRINT "         MAIN MENU":PRINT
24 PRINT " 1 = GENERATE FUNCTION":PRINT
26 PRINT " 2 = TRANSFORM FUNCTION":PRINT
28 PRINT " 3 = INVERSE TRANSFORM":PRINT
30 PRINT " 4 = EXIT":PRINT:PRINT
32 PRINT SPC(10);"MAKE SELECTION";
34 A$ = INKEY$:IF A$="" THEN 34
36 A=VAL(A$):ON A GOSUB 300,40,80,1000
38 GOTO 20
39 REM     *****************************
40 CLS:REM * FORWARD TRANSFORM ROUTINE *
41 REM     *****************************
42 CLS:N=1:M=2:K5=16:K6=-1:GOSUB 108
44 FOR J=0 TO 16:C(2,J)=0:S(2,J)=0:NEXT
45 GOSUB 200: REM - PERFORM DFT
46 GOSUB 140: REM - PRINT OUT FINAL VALUES
48 PRINT:INPUT "C/R TO CONTINUE";A$
50 RETURN
79 REM ************************
80 REM *   INVERSE TRANSFORM  *
81 REM ************************
82 CLS:FOR I=0 TO 15:C(1,I)=0:S(1,I)=0:NEXT
84 N=2:M=1:K5=1:K6=1:GOSUB 200:REM RECONSTRUCT INPUT
85 GOSUB 150:REM PRINT HEADING
86 GOSUB 140:REM PRINT OUTPUT
88 PRINT:INPUT "C/R TO CONTINUE";A$
90 RETURN
100 REM  ******************************************
102 REM  *         PROGRAM SUBROUTINES            * 
104 REM  ****************************************** 
106 REM  *       PRINT COLUMN HEADINGS            * 
108 PRINT:PRINT 
110 PRINT "FREQ    F(COS)      F(SIN)      Y(COS)      Y(SIN)" 
112 PRINT 
114 RETURN 
137 REM ******************************
138 REM *       PRINT OUTPUT         * 
139 REM ******************************
140 FOR Z=0 TO 15
142 PRINT Z;"    "; 
144 PRINT USING "##.#####_    ";C(M,Z),S(M,Z),KC(M,Z),KS(M,Z)
146 NEXT Z 
148 RETURN 
150 REM ******************************
152 REM *    PRINT COLUMN HEADINGS   *
154 PRINT:PRINT
156 PRINT " T        RECONSTRUCTION          INPUT FUNCTION"
158 PRINT
160 RETURN
200 REM *******************************
202 REM *     TRANSFORM/RECONSTRUCT   *
204 REM *******************************
206 FOR J=0 TO 15:REM SOLVE EQNS FOR EACH FREQUENCY
208 FOR I=0 TO 15:REM MULTIPLY AND SUM EACH POINT
210 C(M,J)=C(M,J)+C(N,I)*COS(J*I*K1)+K6*S(N,I)*SIN(J*I*K1)
211 S(M,J)=S(M,J)-K6*C(N,I)*SIN(J*I*K1)+S(N,I)*COS(J*I*K1)
212 NEXT I
214 C(M,J)=C(M,J)/K5:S(M,J)=S(M,J)/K5:REM SCALE RESULTS
216 NEXT J
218 RETURN
299 REM     **********************
300 CLS:REM *   FUNCTION MENU    *
301 REM     **********************
302 FOR I=0 TO 15:C(1,I)=0:S(1,I)=0
303 FOR J=1 TO 2:KC(J,I)=0:KS(J,I)=0:NEXT:NEXT
304 PRINT:PRINT:PRINT "         FUNCTION MENU":PRINT
306 PRINT " 1 = TRIANGLE WAVE":PRINT
308 PRINT " 2 = CIRCLE":PRINT
310 PRINT " 3 = ELLIPSE 1":PRINT
312 PRINT " 4 = ELLIPSE 2":PRINT
320 PRINT SPC(10);"MAKE SELECTION";
322 A$ = INKEY$:IF A$="" THEN 322
326 A=VAL(A$):ON A GOSUB 330,340,350,360,1000
328 RETURN
330 REM *** GENERATE FUNCTION F(X) ***
332 FOR I = 0 TO 15:K3=I*K1
334 C(1,I) = COS(K3)+COS(3*K3)/9+COS(5*K3)/25+COS(7*K3)/49
335 KC(1,I)=C(1,I)
336 NEXT
338 FOR I=1 TO 7 STEP 2:KC(2,I)=1/I^2:NEXT
339 RETURN
340 REM *** GENERATE CIRCLE F(X) ***
342 FOR I = 0 TO 15:K3=I*K1
344 C(1,I) = SIN(K3):S(1,I)=COS(K3)
345 KC(1,I)=C(1,I):KS(1,I)=S(1,I)
346 NEXT
348 KS(2,15)=1
349 RETURN
350 REM *** GENERATE ELLIPSE 1 ***
352 FOR I = 0 TO 15:K3=I*K1
354 C(1,I) = SIN(K3):S(1,I)=2*COS(K3)
355 KC(1,I)=C(1,I):KS(1,I)=S(1,I)
356 NEXT
358 KS(2,1)=1.5:KS(2,15)=.5
359 RETURN
360 REM *** GENERATE ELLIPSE 2 ***
362 FOR I = 0 TO 15:K3=I*K1
364 C(1,I) = COS(K3):S(1,I)=2*SIN(K3)
365 KC(1,I)=C(1,I):KS(1,I)=S(1,I)
366 NEXT
368 KC(2,1)=-.5:KC(2,15)=1.5
369 RETURN
1000 STOP
